#ifndef CSVPARSER_H_
#define CSVPARSER_H_

#include <boost/algorithm/string.hpp>
#include <list>

#include "Pattern.h"

using boost::trim;

typedef vector<string> vstring;

/*
 * =====================================================================================
 *        Class:  ParseException
 *  Description:  Exceção de parseamento
 * =====================================================================================
 */
class ParseException: public exception
{

public:
    virtual const char* what() const throw()
    {
        return "Failed to parse file";
    }
};

/*
 * =====================================================================================
 *        Class:  Parser
 *  Description:  Classe que faz o parseamento do arquivo de entrada
 * =====================================================================================
 */
class Parser
{

public:

    /*-----------------------------------------------------------------------------
     *  Realiza o parseamento de um arquivo
     *-----------------------------------------------------------------------------*/
    static MemoryPtr parse(const string& filename);

private:

    /*-----------------------------------------------------------------------------
     *  Recupera um padrão dado em um vetor de strings
     *-----------------------------------------------------------------------------*/
    static bool getPattern(ifstream& ifs, vstring& buffer);

    /*-----------------------------------------------------------------------------
     *  Recupera uma linha do arquivo
     *-----------------------------------------------------------------------------*/
    static bool getLine(ifstream& ifs, string& line);

    /*-----------------------------------------------------------------------------
     *  Exceção
     *-----------------------------------------------------------------------------*/
    static ParseException parseEx;

};

#endif
